package com.ocean.historyProduct.service.impl;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.ocean.common.utils.DateUtils;
import com.ocean.product.domain.OProduct;
import com.ocean.product.service.IOProductService;
import com.ocean.productRelease.service.IOProductReleaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ocean.historyProduct.mapper.OHistoryProductMapper;
import com.ocean.historyProduct.domain.OHistoryProduct;
import com.ocean.historyProduct.service.IOHistoryProductService;
import com.ocean.common.core.text.Convert;

/**
 * 历史产品Service业务层处理
 *
 * @author ocean
 * @date 2023-02-13
 */
@Service
public class OHistoryProductServiceImpl implements IOHistoryProductService
{
    @Autowired
    private OHistoryProductMapper oHistoryProductMapper;
    @Autowired
    private IOProductService productService;
    @Autowired
    private IOProductReleaseService productReleaseService;

    /**
     * 查询历史产品
     *
     * @param id 历史产品主键
     * @return 历史产品
     */
    @Override
    public OHistoryProduct selectOHistoryProductById(String id)
    {
        return oHistoryProductMapper.selectOHistoryProductById(id);
    }

    /**
     * 查询历史产品列表
     *
     * @param oHistoryProduct 历史产品
     * @return 历史产品
     */
    @Override
    public List<OHistoryProduct> selectOHistoryProductList(OHistoryProduct oHistoryProduct)
    {
        return oHistoryProductMapper.selectOHistoryProductList(oHistoryProduct);
    }

    /**
     * 新增历史产品
     *
     * @param oHistoryProduct 历史产品
     * @return 结果
     */
    @Override
    public int insertOHistoryProduct(OHistoryProduct oHistoryProduct)
    {
        return oHistoryProductMapper.insertOHistoryProduct(oHistoryProduct);
    }

    /**
     * 修改历史产品
     *
     * @param oHistoryProduct 历史产品
     * @return 结果
     */
    @Override
    public int updateOHistoryProduct(OHistoryProduct oHistoryProduct)
    {
        return oHistoryProductMapper.updateOHistoryProduct(oHistoryProduct);
    }

    /**
     * 批量删除历史产品
     *
     * @param ids 需要删除的历史产品主键
     * @return 结果
     */
    @Override
    public int deleteOHistoryProductByIds(String ids)
    {
        return oHistoryProductMapper.deleteOHistoryProductByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除历史产品信息
     *
     * @param id 历史产品主键
     * @return 结果
     */
    @Override
    public int deleteOHistoryProductById(String id)
    {
        return oHistoryProductMapper.deleteOHistoryProductById(id);
    }

    @Override
    public void checkNotUpdateProduct() {
        //重新查询添加历史产品表
        String sql = "select max(pr.create_date) as maxdate,p.id,p.product_name,"
                + "(to_days(sysdate()) - to_days(max(pr.create_date)) - 1) as not_update_days,p.not_update_check_days "
                + "from o_product_release pr "
                + "left join o_product p "
                + "on pr.product_id = p.id "
                + "where (p.not_update_check_days <> null or p.not_update_check_days <> '') and p.is_join_history = 1 "
                + "group by pr.product_id "
                + "having to_days(sysdate()) - to_days(maxdate) > "
                + "(select p1.not_update_check_days from o_product p1 "
                + "where p1.not_update_check_days <> null or p1.not_update_check_days <> '' "
                + "and p1.is_join_history = 1 and p1.id = pr.product_id) "
                + "order by maxdate desc";
        List<Map> list = productService.checkNotUpdateProduct();
        if (list.size() < 1) {
            return;
        }
        //查询当前历史产品记录
        List<OHistoryProduct> historyProductList = oHistoryProductMapper.selectOHistoryProductList(new OHistoryProduct());
        //循环结果集添加历史产品对象
        for (Map map : list) {
            //最后更新日期:map.get("maxdate"),产品id:map.get("id"),产品名称:map.get("product_name");
            //未更新天数:map.get("not_update_days"),未更新检查天数:map.get("not_update_check_days")
            //创建历史产品对象
            OHistoryProduct historyProduct = new OHistoryProduct();
            historyProduct.setProductId((String)map.get("id"));
            historyProduct.setProductName((String)map.get("product_name"));
            historyProduct.setHistoryCheckDays((String)map.get("not_update_check_days"));
            historyProduct.setLastUpdateDays(map.get("maxdate") + "");
            historyProduct.setNotUpdateDays(Long.parseLong(map.get("not_update_days") + ""));
            historyProduct.setCreateDate(new Date());
            if (historyProductList.size() > 0) {
                //循环对比，存在的历史产品更新，不存在的添加
                boolean flag = true;
                for (OHistoryProduct history:historyProductList) {
                    if (historyProduct.getProductId().equals(history.getProductId())) {
                        historyProduct.setId(history.getId());
                        oHistoryProductMapper.updateOHistoryProduct(historyProduct);
                        flag = false;
                    }
                }
                if (flag) {
                    oHistoryProductMapper.insertOHistoryProduct(historyProduct);
                }
            } else {
                //过期未更新产品添加历史纪录中
                oHistoryProductMapper.insertOHistoryProduct(historyProduct);
            }
        }
        //循环对比判断，1、存入历史的后期进行更新，2、存入历史的历史检查天数变化，删除历史产品相关历史产品信息
        for (OHistoryProduct historyProduct:historyProductList) {
            //int notUpdateDays = historyProductList.get(i).getNotUpdateDays();
            boolean flag = true;
            for (Map map : list) {
                String productId = (String)map.get("id");
                if (productId.equals(historyProduct.getProductId())) {
                    flag = false;
                }
            }
            //如果新查询过期历史产品与前一天历史产品表不匹配
            if (flag) {
                //查询产品表判断，用于判断是否因修改历史检查天数原因
                OProduct product = productService.selectOProductById(historyProduct.getProductId());
                if (product != null) {
                    if (Integer.parseInt(product.getNotUpdateCheckDays()) > historyProduct.getNotUpdateDays()) {
                        oHistoryProductMapper.deleteOHistoryProductById(historyProduct.getId());
                    }
                }
                //查询产品文件表，用于判断是否因产品重新更新原因
                Date maxdate = productReleaseService.selectLastCreateDateByProductId(historyProduct.getProductId());
                Date dt1 = DateUtils.dateTime("yyyy-MM-dd hh:mm",maxdate+"");
                Date dt2 = DateUtils.dateTime("yyyy-MM-dd hh:mm",historyProduct.getLastUpdateDays());
                //最新日期大于历史最后更新日期
                if (dt1.getTime() > dt2.getTime()) {
                    oHistoryProductMapper.deleteOHistoryProductById(historyProduct.getId());
                }
            }
        }
    }
}
